package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io"
	"os"
)

/*
	学生信息系统
	1.添加学生信息，无限次数添加
		先判断学生信息是否存在
			若存在，发送提示信息
			若不存在，添加学生信息（年龄、姓名、性别、住址）
	2.查询学生信息
	按名字查询
	将数据永久保存（放入文件内），使用json（轻量级的数据交换格式）
	3.按q/Q退出
*/

var stuName string = ""
var stuAge string = ""
var stuSex string = ""
var stuAddr string = ""
var stuInfo = map[string]map[string]string{}
var write_file, _ = os.OpenFile("homework/2024-08-19-go-map作业/沙诺珩/stu_info.txt", os.O_APPEND, 777)
var read_file, _ = os.OpenFile("homework/2024-08-19-go-map作业/沙诺珩/stu_info.txt", os.O_RDONLY, 777)

func main() {

	//json 转为map
	reader := bufio.NewReader(read_file)
	for {
		line, _, e := reader.ReadLine()
		if e == io.EOF {
			break
		}
		json.Unmarshal([]byte(line), &stuInfo)
	}
	index()
	write_file.Close()
	read_file.Close()
}

func index() {
	var num string
	fmt.Println("-------学生信息查询系统---------")
	fmt.Println("1.添加学生信息")
	fmt.Println("2.查询学生信息")
	fmt.Println("按q/Q，退出系统")
	fmt.Println("请输入您要进行的操作:")
	fmt.Scanln(&num)
	if num == "1" {
		fmt.Println("请输入要添加的学生姓名：")
		fmt.Scanln(&stuName)
		addStu(stuName)
		index()
	} else if num == "2" {
		queryStu()
	} else if num == "q" || num == "Q" {
		fmt.Println("--------退出系统-------------")
		return
	}
}

func addStu(name string) {
	value, ok := stuInfo[name]
	// 返回的第二个值“ok”是状态，为true表示可以取到值，为False不能取到值
	if ok {
		fmt.Println("此学生信息已存在，其具体信息为：", value)
	} else {
		fmt.Println("请输入学生的年龄：")
		fmt.Scanln(&stuAge)
		stuInfo[name] = map[string]string{
			"age": stuAge,
		}
		fmt.Println("请输入学生的性别：")
		fmt.Scanln(&stuSex)
		stuInfo[name]["sex"] = stuSex
		fmt.Println("请输入学生的家庭地址：")
		fmt.Scanln(&stuAddr)
		stuInfo[name]["address"] = stuAddr
		fmt.Println(name, "的学生信息创建成功！！！")
		//map 转为json
		fmt.Println(stuInfo)
		var jsonData, _ = json.Marshal(stuInfo)
		write_file.WriteString(string(jsonData))
		index()
	}

}
func queryStu() {
	fmt.Println("请输入要查询的学生姓名：")
	fmt.Scanln(&stuName)
	fmt.Println(stuInfo)
	value, ok := stuInfo[stuName]
	// 返回的第二个值“ok”是状态，为true表示可以取到值，为False不能取到值
	if ok {
		fmt.Println("此学生信息已存在，其具体信息为：", value)
	} else {
		fmt.Println("此学生信息不存在，请前往添加")
	}
	index()

}

/*
文件写缓存 到磁盘
1、文件关闭的时候
2、缓冲区满
3、手动flush
4、程序退出
*/
